ডিপেন্ডেন্সি ইনজেকশন সহ সার্ভিস টেস্টিং

Web Development - অ্যাঙ্গুলার (Angular) - Angular টেস্টিং |
2
2

Angular অ্যাপ্লিকেশন তৈরি করার সময়, সার্ভিসগুলি গুরুত্বপূর্ণ রোল পালন করে এবং সেগুলির টেস্টিং নিশ্চিত করতে হয়। ডিপেন্ডেন্সি ইনজেকশন (DI) ব্যবস্থার কারণে, সার্ভিসগুলি বিভিন্ন কম্পোনেন্টে ইনজেক্ট হয় এবং সঠিকভাবে টেস্ট করা প্রয়োজন। Angular-এ টেস্টিংয়ের জন্য আমরা সাধারণত Jasmine এবং Karma ব্যবহার করি, তবে আপনি টেস্টিংয়ের জন্য অন্য টুলও ব্যবহার করতে পারেন।

Angular-এ সার্ভিস টেস্ট করার সময়, যদি সার্ভিসটি অন্য সার্ভিস বা ডিপেন্ডেন্সি ব্যবহার করে, তাহলে DI ব্যবস্থার মাধ্যমে সেই ডিপেন্ডেন্সি মক (mock) বা স্টাব (stub) করে টেস্ট করা হয়।


সার্ভিস টেস্টিংয়ের মৌলিক ধারণা

  1. Service Injection: যখন আমরা সার্ভিস টেস্ট করি, তখন এটি TestBed মাধ্যমে ইনজেক্ট করা হয়। Angular টেস্টিং পরিবেশে TestBed কনফিগারেশন আমাদের সার্ভিস এবং তার ডিপেন্ডেন্সি ইনজেক্ট করতে সাহায্য করে।
  2. Mocking Dependencies: অনেক সময় সার্ভিসের ডিপেন্ডেন্সি গুলোকে মক (mock) করা হয়, বিশেষ করে যখন ডিপেন্ডেন্সি গুলো অ্যাসিনক্রোনাস অথবা থার্ড পার্টি লাইব্রেরি হয়।

Angular-এ ডিপেন্ডেন্সি ইনজেকশন সহ সার্ভিস টেস্টিং

ধরা যাক, আপনার একটি সার্ভিস DataService রয়েছে, যা একটি HTTP সার্ভিসের মাধ্যমে ডেটা ফেচ করে। এই সার্ভিসের টেস্ট করার সময়, আমরা HTTP রিকোয়েস্টগুলিকে মক করে এবং সার্ভিসটির কার্যকারিতা যাচাই করি।

1. DataService সার্ভিসের উদাহরণ

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class DataService {
  constructor(private http: HttpClient) {}

  fetchData(): Observable<any> {
    return this.http.get('https://api.example.com/data');
  }
}

এই সার্ভিসটি HttpClient ব্যবহার করে ডেটা ফেচ করে এবং Observable হিসেবে রিটার্ন করে।

2. সার্ভিস টেস্টিং কনফিগারেশন

TestBed ব্যবহার করে DataService-এর টেস্ট কনফিগারেশন করা হয়। আমরা HttpClientTestingModule ব্যবহার করব, যা HTTP রিকোয়েস্ট মক করতে সহায়ক।

import { TestBed } from '@angular/core/testing';
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
import { DataService } from './data.service';

describe('DataService', () => {
  let service: DataService;
  let httpMock: HttpTestingController;

  beforeEach(() => {
    TestBed.configureTestingModule({
      imports: [HttpClientTestingModule],
      providers: [DataService]
    });
    service = TestBed.inject(DataService);
    httpMock = TestBed.inject(HttpTestingController);
  });

  afterEach(() => {
    httpMock.verify();  // নিশ্চিত করে যে কোনো অনাকাঙ্ক্ষিত HTTP কল হয়নি
  });

  it('should be created', () => {
    expect(service).toBeTruthy();
  });

  it('should fetch data from the API', () => {
    const mockData = { name: 'John', age: 30 };

    service.fetchData().subscribe(data => {
      expect(data).toEqual(mockData);  // আসল ডেটার সাথে মক ডেটা তুলনা
    });

    const req = httpMock.expectOne('https://api.example.com/data');
    expect(req.request.method).toBe('GET');  // নিশ্চিত করা যে GET রিকোয়েস্ট হয়েছে
    req.flush(mockData);  // মক ডেটা পাঠানো
  });
});

3. টেস্ট কনফিগারেশন বিশ্লেষণ

  1. TestBed Configuration: TestBed.configureTestingModule ব্যবহার করে আমরা আমাদের সার্ভিস এবং প্রয়োজনীয় মডিউলগুলি কনফিগার করি।
    • HttpClientTestingModule: এটি HttpClient-এর HTTP রিকোয়েস্টগুলিকে মক করে দেয়।
    • providers: সার্ভিসটি প Providers অ্যারে দ্বারা ইনজেক্ট করা হয়।
  2. beforeEach(): প্রতিটি টেস্টের আগে, আমরা TestBed.inject() দিয়ে সার্ভিস এবং HTTP মক কন্ট্রোলারকে ইনজেক্ট করি।
  3. afterEach(): টেস্টের পর, আমরা httpMock.verify() ব্যবহার করে নিশ্চিত করি যে কোনো অবাঞ্চিত HTTP রিকোয়েস্ট হয়নি।
  4. Test Cases:
    • প্রথম টেস্টটি চেক করে যে সার্ভিসটি সঠিকভাবে তৈরি হয়েছে কি না।
    • দ্বিতীয় টেস্টটি fetchData() মেথডটি ঠিকমতো ডেটা ফেরত দিচ্ছে কিনা পরীক্ষা করে।
    • httpMock.expectOne() মাধ্যমে আমরা পরীক্ষা করি যে নির্দিষ্ট API URL-এ একটিই HTTP GET রিকোয়েস্ট হচ্ছে।
    • req.flush(mockData) মক ডেটা সার্ভিসে পাঠানোর জন্য ব্যবহৃত হয়।

মকিং ডিপেন্ডেন্সি

যখন আপনার সার্ভিসের কোনো নির্দিষ্ট ডিপেন্ডেন্সি থাকে, যেমন অন্য সার্ভিস বা মডিউল, তখন সেগুলিকে মক করা হয়। উদাহরণস্বরূপ, আপনি যদি সার্ভিসের ভেতরে AuthService বা LoggerService ইনজেক্ট করেন, তবে আপনি এই ডিপেন্ডেন্সিগুলোকে মক (mock) করে টেস্ট করতে পারেন।

import { AuthService } from './auth.service';

describe('DataService', () => {
  let service: DataService;
  let authServiceMock: jasmine.SpyObj<AuthService>;

  beforeEach(() => {
    authServiceMock = jasmine.createSpyObj('AuthService', ['isAuthenticated']);
    
    TestBed.configureTestingModule({
      imports: [HttpClientTestingModule],
      providers: [
        DataService,
        { provide: AuthService, useValue: authServiceMock }  // AuthService মক করা
      ]
    });

    service = TestBed.inject(DataService);
  });

  it('should call isAuthenticated method of AuthService', () => {
    authServiceMock.isAuthenticated.and.returnValue(true);  // মক রিটার্ন ভ্যালু

    service.fetchData();  // সার্ভিসের মেথড কল

    expect(authServiceMock.isAuthenticated).toHaveBeenCalled();  // মক মেথড কল চেক করা
  });
});

এখানে, AuthService মক করা হয়েছে এবং আমরা পরীক্ষা করেছি যে isAuthenticated মেথডটি DataService থেকে ঠিকমতো কল হচ্ছে কিনা।


সার্ভিস টেস্টিংয়ের উপকারিতা

  1. এনক্যাপসুলেশন: সার্ভিস টেস্টিংয়ের মাধ্যমে আপনি সার্ভিসের কার্যকারিতা পৃথকভাবে যাচাই করতে পারেন, যার ফলে অ্যাপ্লিকেশনের বাকি অংশগুলোতে প্রভাব পড়ে না।
  2. ডিপেন্ডেন্সি মকিং: ডিপেন্ডেন্সিগুলির মকিং টেস্টে সাহায্য করে এবং এটি সার্ভিসের আচরণ সম্পূর্ণভাবে পরীক্ষা করতে সক্ষম করে।
  3. রিফ্যাক্টরিং সহজ করা: সার্ভিসে পরিবর্তন বা রিফ্যাক্টরিং করার সময় টেস্টগুলি আপনাকে সঠিকতা নিশ্চিত করতে সাহায্য করে।

এইভাবে, Angular-এ ডিপেন্ডেন্সি ইনজেকশনের সাথে সার্ভিস টেস্টিং করা একটি শক্তিশালী উপায় হতে পারে যাতে অ্যাপ্লিকেশনের কার্যকারিতা এবং নির্ভরযোগ্যতা বজায় রাখা যায়।

Content added By
Promotion